package top.gokzzz.common.utils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 集合 工具類
 *
 * @author Gok
 * @version 1.2
 */
public class CollUtil {

    /**
     * 新建一個 ArrayList
     *
     * @param values 元素
     * @return {@link List }<{@link T }>
     */
    @SafeVarargs
    public static <T> ArrayList<T> newList(T... values) {
        if (isEmpty(values)) {
            return new ArrayList<>();
        }
        final ArrayList<T> arrayList = new ArrayList<>(values.length);
        Collections.addAll(arrayList, values);
        return arrayList;
    }

    /**
     * 將集合中的元素連接成一個字串，使用默認分隔符號（逗號）。
     *
     * @param collection 要連接的集合
     * @return 連接後的字串，如果集合為空或為null，則返回空字串
     */
    public static String separate(Collection<?> collection) {
        return separate(collection, ",");
    }

    /**
     * 將集合中的元素連接成一個字串，使用指定的分隔符號。
     *
     * @param collection 要連接的集合
     * @param delimiter  指定的分隔符號
     * @return 連接後的字串，如果集合為空或為null，則返回空字串
     */
    public static String separate(Collection<?> collection, String delimiter) {
        if (isEmpty(collection)) {
            return "";
        }
        if (delimiter == null) {
            delimiter = ",";
        }
        StringBuilder sb = new StringBuilder();
        for (Object element : collection) {
            sb.append(element).append(delimiter);
        }
        // 去除最後一個分隔符
        sb.setLength(sb.length() - delimiter.length());
        return sb.toString();
    }

    /**
     * Collection 大小
     *
     * @param collection /
     * @return int
     */
    public static int size(Collection<?> collection) {
        return isEmpty(collection) ? 0 : collection.size();
    }

    /**
     * Collection 是否為空
     *
     * @param collection /
     * @return boolean
     */
    public static boolean isEmpty(Collection<?> collection) {
        return collection == null || collection.isEmpty();
    }

    /**
     * Collection 是否不為空
     *
     * @param collection /
     * @return boolean
     */
    public static boolean isNotEmpty(Collection<?> collection) {
        return !isEmpty(collection);
    }

    /**
     * 數組是否為空
     *
     * @param array 數組
     * @return boolean
     */
    public static <T> boolean isEmpty(T[] array) {
        return array == null || array.length == 0;
    }

    /**
     * 數組是否不為空
     *
     * @param array 數組
     * @return boolean
     */
    public static <T> boolean isNotEmpty(T[] array) {
        return isEmpty(array);
    }

    /**
     * 計算兩個集合的「交集」，返回元素唯一的 Set
     *
     * @param coll1 第一個集合
     * @param coll2 第二個集合
     * @return 包含交集的 Set
     */
    public static <T> Set<T> intersection(Collection<? extends T> coll1, Collection<? extends T> coll2) {
        if (isEmpty(coll1) || isEmpty(coll2)) {
            return new HashSet<>();
        }
        Set<T> result = new HashSet<>(coll1);
        result.retainAll(coll2);
        return result;
    }

    /**
     * 計算兩個集合的「並集」，返回元素唯一的 Set
     *
     * @param coll1 第一個集合
     * @param coll2 第二個集合
     * @return 包含並集的 Set
     */
    public static <T> Set<T> union(Collection<? extends T> coll1, Collection<? extends T> coll2) {
        if (isEmpty(coll1) || isEmpty(coll2)) {
            return new HashSet<>();
        }

        Set<T> result = new HashSet<>(coll1);
        result.addAll(coll2);
        return result;
    }

}
